import datasets

# 加载cifar100-enriched数据集的测试集，如同阅读一本心法
ds = datasets.load_dataset("cifar100-enriched", split="test")

# 将数据集转换为Pandas DataFrame，就像将零散的招式编纂成连招
df = ds.to_pandas()

import pandas as pd
import numpy as np
from cleanlab import Datalab

# 使用Datalab寻找数据中的问题，如同武林高手寻找对手的破绽
lab = Datalab(data=df, label_name="fine_label")

# 将DataFrame中的"embedding"列转换为numpy数组，如同将散落的招式秘籍编纂成连贯的招式
features = np.array([x.tolist() for x in df["embedding"]])

# 将DataFrame中的"probabilities"列也转换为numpy数组，如同收集各路信息，为出招做准备
pred_probs = np.array([x.tolist() for x in df["probabilities"]])

# 调用find_issues方法寻找数据问题，如同武林侠客挑战江湖隐秘，揭示真相
lab.find_issues(features=features, pred_probs=pred_probs)

# 将原始数据框与发现的问题合并，如同将新发现的武林秘籍融入已有的知识体系中
df = pd.concat([df, lab.get_issues()], axis=1)

from renumics.spotlight.analysis import DataIssue

# 寻找标签问题的行，如同武林中的侠客追踪敌人的踪迹
label_issue_rows = df[df["is_label_issue"]].sort_values("label_score").index.tolist()
# 记录标签问题，如同将侦查到的情报记录在案
label_issue = DataIssue(
    severity="medium",
    title="label-issue",
    rows=label_issue_rows,
    description="Label issue found by Cleanlab - Review and correct if necessary",
)

# 寻找异常值问题的行，如同寻找隐藏在暗处的敌人
outlier_issue_row = (
    df[df["outlier_score"] < 0.6].sort_values("outlier_score").index.tolist()
)
# 记录异常值问题，如同标记出潜藏的危险
outlier_issue = DataIssue(
    severity="medium",
    title="outlier-issue",
    rows=outlier_issue_row,
    description="Outlier score < 0.6 - Review and remove or collect more data",
)

# 寻找几乎重复问题的行，如同寻找武林中几乎看不出差别的影子剑客
near_duplicate_issue_row = (
    df[df["is_near_duplicate_issue"]].sort_values("near_duplicate_score").index.tolist()
)
# 记录几乎重复的问题，如同揭露伪装的敌人
near_duplicate_issue = DataIssue(
    severity="medium",
    title="near-duplicate-issue",
    rows=near_duplicate_issue_row,
    description="Near duplicate issue found by Cleanlab - Review and remove if necessary",
)

from renumics import spotlight

# 定义数据类型，如同为武林中的各种武器赋予名号
dtypes = {
    "image": spotlight.Image,  # 图像数据，如同武林中的画卷，记录着形象
    "full_image": spotlight.Image,  # 完整图像数据，如同详尽的地图，展现全貌
    "embedding": spotlight.Embedding,  # 嵌入数据，如同内力深厚的武功秘籍
    "embedding_reduced": spotlight.Embedding,  # 简化的嵌入数据，精简而不失精髓
    "probabilities": spotlight.Embedding,  # 概率数据，如同预测敌人下一步的先天能力
}

# 展示数据及其问题，如同武林大会上展示武功，亮出绝技
spotlight.show(
    df.rename(columns={"fine_label_str": "label", "fine_label_prediction_str": "pred"}),  # 重命名列，如同为武功起名，更易理解
    dtype=dtypes,  # 指定数据类型，如同明确每位武林人士的门派和武功
    layout="https://spotlight.renumics.com/resources/layout_data_issues.json",  # 使用布局文件，如同选择武林大会的比武场地
    issues=[label_issue, outlier_issue, near_duplicate_issue],  # 展示发现的问题，如同揭示对手的破绽
)